#Requires AutoHotkey v2.0

; 选项窗口
class OptWindow {
    static window := Gui() ; 窗口
    static mainMenuBar := MenuBar() ; 菜单组件
    static comp := Map() ; 窗口组件
    static ready := false ; 窗口是否就绪
    static display := false ; 窗口是否显示

    ; 切换窗口的状态(显示&隐藏)
    static toggle() {

        ; 如果窗口没有创建，创建它
        if (!this.ready) {
            this.init()
            this.ready := true ; 标记文件已经创建好了
        }

        ; 窗口隐藏，显示它; 窗口显示，隐藏它
        if (this.display) {
            this.window.Hide()
            this._assignment() ; 设置组件的状态
            this.display := false
        } else {
            this.window.Show("w240 h240")
            this.comp["hiddenEdit"].Focus() ; 获取焦点
            this._assignment() ; 设置组件的状态
            this.display := true
        }
    }

    static _assignment() {

        ; 如果窗口没有创建，返回
        if (!this.ready) {
            return
        }

        ; 设置组件的状态
        this.comp["ctrlC"].value := clip.ctrlCEnabled
        this.comp["ctrlV"].value := clip.ctrlVEnabled
        this.comp["ctrlR"].value := clip.ctrlREnabled
        this.comp["ctrlF6"].value := clip.ctrlF6Enabled
        this.comp["F6"].value := clip.F6Enabled
        this.comp["clipWriteDataFile"].value := clip.clipWriteDataFile
        this.comp["checkFileEnabled"].value := clip.checkFileEnabled

    }

    static init() {

        ; 声明全局变量
        global clip

        ; 设置窗口外观
        this.window.SetFont("s10 q5", "SimSun")
        this.window.Title := "Clip设置"
        this.window.Name := "Clip设置"
        ; this.window.MarginX()
        this.window.MarginY := 12 ; 组件间距

        ; 添加菜单
        this._menu_init()

        ; 添加组件
        this.window.Add("Edit", "w200 h0 Hidden") ; 撑起上方

        this.comp["ctrlC"] := this.window.Add("Checkbox", "Center Section -Wrap X60", "快捷键 Ctrl+C")
        this.comp["ctrlV"] := this.window.Add("Checkbox", "Center -Wrap Border", "快捷键 Ctrl+V")
        this.comp["ctrlR"] := this.window.Add("Checkbox", "Center -Wrap", "快捷键 Ctrl+R")
        this.comp["F6"] := this.window.Add("Checkbox", "Center -Wrap", "快捷键 F6")
        this.comp["ctrlF6"] := this.window.Add("Checkbox", "Center -Wrap", "快捷键 Ctrl+F6")

        this.comp["clipWriteDataFile"] := this.window.Add("Checkbox", "Center -Wrap", "保存粘贴板内容")
        this.comp["checkFileEnabled"] := this.window.Add("Checkbox", "Center -Wrap", "检查文件更新")

        this.comp["setting"] := this.window.Add("Button", " -Wrap Center Section", "应用")
        this.comp["cancel"] := this.window.Add("Button", " -Wrap Center YS", "取消")

        ; 添加一个不可见的控件用于接收初始焦点
        this.comp["hiddenEdit"] := this.window.Add("Edit", "w0 h0 Hidden")

        ; 暂时禁用的设置(待完善)
        this.comp["ctrlC"].Enabled := false
        this.comp["F6"].Enabled := false
        this.comp["ctrlF6"].Enabled := false

        ; this.window.hiddenEdit.Focus() ;获取焦点

        ; 设置组件状态
        this._assignment() ; 设置组件的状态

        ; 绑定事件
        this.window.OnEvent("Close", (t) => this._on_close(t)) ; 应用设置
        this.comp["setting"].OnEvent("Click", (g, e) => this._on_setting(g, e)) ; 应用设置
        this.comp["cancel"].OnEvent("Click", (g, e) => this._on_cancel(g, e)) ; 关闭窗口
    }

    static _menu_init() {

        ; 声明全局变量
        global clip

        ; 文件
        menu_file := Menu()
        ; == 数据文件
        menu_file_data := menu()
        menu_file_data.Add("打开", (a, b, c) => this._openFile(clip.dataFile))
        menu_file.Add("数据文件", menu_file_data)

        ; == 粘贴板
        menu_file_clip := menu()
        menu_file_clip.Add("打开", (a, b, c) => this._openFile(clip.copyFile))
        menu_file.Add("今日粘贴板", menu_file_clip)

        ; == 文本编辑器
        menu_file_edit := menu()
        menu_file_edit.Add("重设为记事本", (a, b, c) => this._test_tip1())
        menu_file_edit.Add("还原", (a, b, c) => this._test_tip1())
        menu_file.Add("文本编辑器", menu_file_edit)

        ; == 更多
        menu_file.Add("其他", this._test_tip1)

        this.mainMenuBar.Add("文件", menu_file)

        ; 编辑
        menu_edit := Menu()
        menu_edit.Add("复制", this._test_tip1)
        menu_edit.Add("粘贴", this._test_tip1)
        this.mainMenuBar.Add("编辑", menu_edit)

        this.window.MenuBar := this.mainMenuBar
    }
    static _on_close(thisWindow) {

        rt := MsgBox("是否保存设置?", "Clip", "OC Icon? Default1")

        ; 点击取消，直接关闭(隐藏)窗口
        if (rt = "Cancel") {
            this._on_cancel("GuiCtrl", "EventInfo")
            return 1
        }

        ; 否则的话，保存并关闭(隐藏)窗口
        this._on_setting("GuiCtrl", "EventInfo")
        return 1
    }

    static _on_setting(GuiCtrl, EventInfo) {

        ; 声明全局变量
        global clip

        if (!this.ready) {
            return
        }

        ; 处理数据

        this._s_ctrlVEnable(this.comp["ctrlV"].value)
        this._s_ctrlREnable(this.comp["ctrlR"].value)

        this._s_clipWriteDataFile(this.comp["clipWriteDataFile"].value)
        this._s_checkFileEnabled(this.comp["checkFileEnabled"].value)

        ; 隐藏窗口
        this.display := false
        this.window.Hide()
    }


    static _on_cancel(GuiCtrl, EventInfo) {
        this.display := false
        this._assignment() ; 设置组件的状态
        this.window.Hide()
    }

    static _s_ctrlVEnable(option) {

        global clip ; 声明全局变量
        this._testValue(option) ; 测试值是否合法
        clip.ctrlVEnabled := Option

        ; 设置是否启用快捷键
        if (clip.ctrlVEnabled == 0) {
            Hotkey("^v", (k) => ClipCore.modelPaste(k), "OFF")
        } else {
            Hotkey("^v", (k) => ClipCore.modelPaste(k), "ON")
        }
    }

    static _s_ctrlREnable(option) {

        global clip ; 声明全局变量
        this._testValue(option) ; 测试值是否合法
        clip.ctrlREnabled := Option

        ; 设置是否启用快捷键
        if (clip.ctrlREnabled == 0) {
            Hotkey("^r", (k) => ClipCore.repeat(k), "OFF")
        } else {
            Hotkey("^r", (k) => ClipCore.repeat(k), "ON")
        }
    }

    ; 设置检查文件是否更新
    static _s_checkFileEnabled(option) {

        global clip ; 声明全局变量
        this._testValue(option) ; 测试值是否合法
        clip.checkFileEnabled := Option
    }

    ; 设置检查文件是否更新
    static _s_clipWriteDataFile(option) {

        global clip ; 声明全局变量
        this._testValue(option) ; 测试值是否合法
        clip.clipWriteDataFile := Option
    }

    ; 测试值是否合法(合法，无事发生； 非法，退出程序)
    static _testValue(val) {
        if (val != 1 && val != 0) {
            ClipCore.exit("非法的快捷键设置")
        }
    }

    ; 未完善的功能给的提示
    static _test_tip1(*) {
        MsgBox("未完成的功能")
    }

    ; 使用外部文本编辑器打开文本
    static _openFile(filePath) {

        ; 如果设置的文本编辑器存在，使用它打开文件
        if (FileExist(clip.ex_edit)) {
            Run(clip.ex_edit . " " . filePath)
            return
        }

        ; 如果设置的文本编辑器不存在，使用记事本打开文件
        Run("notepad.exe " filePath)
    }
}